
/**
 * @brief устанавливает флаг с желаемой позицией
 * @result преобразованное входное число с установленным флагом
 * @arg arg входное число (в котором необходимо установить флаг)
 * @arg flag_position номер бита, в котором устанавливается флаг
 */
unsigned set_flag(unsigned arg, unsigned short flag_position)
{
    unsigned i=0;
    i |= 0x1;
    i<<=flag_position;
    unsigned result=arg | i;
    return result;
}
/**
 * @brief сбрасывает анавливает флаг с желаемой позицией
 * @result преобразованное входное число со сброшенным флагом
 * @arg arg входное число (в котором необходимо сбросить флаг)
 * @arg flag_position номер бита, в котором сбрасывается флаг
 */

unsigned unset_flag(unsigned arg, unsigned short flag_position)
{
    unsigned i=0;
    i ^= 0x1;
    i<<=flag_position;
    unsigned result=arg ^ i;
    return result;
}

#include <iostream>
int main()
{
    unsigned num = 0x0;
    
    for (unsigned i = 0; i < 32; ++i)
    {
        num = set_flag(num, i);
        std::cout
        << std::dec << "num after setting flag "
        << i << " = " << std::hex << num << "\n";
    }
    
    for (unsigned i = 0; i < 32; ++i)
    {
        num = unset_flag(num, i);
        std::cout
        << std::dec << "num after unsetting flag "
        << i << " = " << std::hex << num << "\n";
    }
    
    return 0;
}
